home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 010 / trek.arc / TREKMAIN.BAS (.txt) < prev    next >
Encoding:
GW-BASIC  |  1985-03-24  |  54.0 KB  |  745 lines

  1. 100  DEFINT A-Z
  2. 110  COMMON SP,FIN,D!,RK,RC,RB,RR!,RT!,KST,KB,KK,KC,G(),CX(),CY(),BX(),BY()
  3. 120  COMMON NS(),P(),UX,UY,RS,KR,RR,KS,CR,KP,Q(),KX(),KY(),KP!(),KA!(),KD!()
  4. 130  COMMON NK,NB,NR!,NC,NT!,NST,NE!,NSH!,NT,NL!,ND!,E!,S!,SU,C,T,S$
  5. 140  COMMON QX,QY,SX,SY,W!,WS!,L!,D!(),LN,S,P$,DS!,DR!,H!,T!,BX,BY,DF!,COMM
  6. 150  COMMON HK,KC,CS,NH,NKN,S(),F!(),GO,G1,A,JI,R,AD,DF!,SC,TX,TY,ND,PX,PY,O
  7. 160  COMMON LD,P,MN,NP,HE,HS,NZ,HR,CF,SN,CG,SB,SE,CP!,CT,DB,BAX,BAY,CR!(),DO,IN$
  8. 300  DEF FNR(X)=INT(RND(1)*X)+1
  9. 310  DEF FNE!(E!)=-E!*LOG(RND(1))
  10. 320  DEF FNP1!(X1,X2,Y1,Y2)=(X1-X2)^2+(Y1-Y2)^2
  11. 330  DEF FNP2!(X1,X2,Y1,Y2)=SQR(FNP1!(X1,X2,Y1,Y2))
  12. 400  FIELD #1,73 AS TMSG$
  13. 500  ZZZ=RND(1)*RND(1)*1000 MOD 13:RANDOMIZE ZZZ
  14. 1000  ' trekmain MAIN-LINE
  15. 1010  IF AD<>0 THEN CHAIN "TREKFINE"
  16. 1012  T!=0:JI=0:GO=0
  17. 1020  ' IF DO=1 AND D!(11)+D!(1)<=0 THEN GOSUB 8000:DO=0
  18. 1050  PRINT:PRINT "Command: ";:GOSUB 11000:IF IN$="" THEN PRINT:PRINT "Blank line ignored.":GOTO 1050 ELSE GOSUB 10000
  19. 1060  IF BDKEY$<>"A" THEN 1050
  20. 1065  IF BDS$="FRE" THEN PRINT FRE(0);:GOTO 1050
  21. 1070  GOSUB 12000:' match to command
  22. 1071  ' 1-chart      6-lrscan    11-photons   16-shuttle    21-warp
  23. 1072  ' 2-crystals   7-move      12-planets   17-status
  24. 1073  ' 3-dock       8-mine      13-srscan    18-transport
  25. 1074  ' 4-damages    9-orbit     14-sensors   19-request
  26. 1075  ' 5-impulse   10-phasers   15-shields   20-rest
  27. 1076  '------------------------------------------------------------------
  28. 1077  ' 22-abandon    24-destruct   26-terminate   28-freeze
  29. 1078  ' 23-deathray   25-help       27-command     29-thaw
  30. 1080  IF COMM<>0 THEN IF COMM=27 THEN 1082 ELSE 1100
  31. 1081  PRINT:PRINT "'"BDS$"' unknown command.   Valid commands are:"
  32. 1082  MS=6:MS(1)=8:MS(2)=9:MS(3)=10:MS(4)=11:MS(5)=12:MS(6)=13:GOSUB 15000
  33. 1088  GOTO 1050
  34. 1100  ON COMM GOSUB 8600,23400,9000,9100,23000,8500,33500,23300,23100,22000,21000,9300,8000,9400,8700,23500,8200,23200,8060,9500,9200,24100,24000,26000,24200,2200,1500,25001,25002
  35. 1110  IF COMM=5 OR COMM=7 OR COMM=8 OR COMM=9 OR COMM=11 OR COMM=16 OR COMM=20 THEN 1200
  36. 1120  IF COMM=10 OR COMM=22 THEN 1250
  37. 1130  IF COMM=15 THEN 1270
  38. 1190  GOTO 1000
  39. 1200  IF GO=0 THEN 1000
  40. 1210  IF T!<>0 THEN GOSUB 30000
  41. 1220  IF AD<>0 THEN CHAIN "TREKFINE"
  42. 1230  IF G(QX,QY)=1000 THEN GOSUB 33000:GOTO 1200
  43. 1240  GOTO 1260
  44. 1250  IF GO=0 THEN 1000
  45. 1260  IF HE<>0 THEN GOSUB 20000
  46. 1265  GOTO 1000
  47. 1270  IF GO=0 THEN 1000
  48. 1280  IF HE<>0 THEN GOSUB 20000
  49. 1285  SC=0:GOTO 1000
  50. 1500  RETURN:' dummy
  51. 2200  'TERM
  52. 2210  FIN=0:CHAIN "TREKFINE
  53. 8000  ' srscan
  54. 8005  ' IF DO=1 THEN RS$="N":GOTO 8030
  55. 8007  IF D!(1)<>0 THEN PRINT "S. R. Scanner damaged !":RETURN
  56. 8010  GOSUB 10000
  57. 8020  IF BDKEY$="A" AND LEFT$(BDS$,1)="N" THEN RS$="N" ELSE RS$="Y"
  58. 8030  S(QX,QY)=1
  59. 8040  LS$="Y"
  60. 8050  PRINT:PRINT "   1 2 3 4 5 6 7 8 9 10"
  61. 8055  K=0:GOTO 8300
  62. 8060  ' request entry
  63. 8070  GOSUB 10000
  64. 8080  IF BDKEY$="A" THEN 8090
  65. 8085  PRINT "  Information desired ? ";:GOSUB 11000:GOTO 8070
  66. 8090  IF LEN(BDS$)>2 THEN BDS$=LEFT$(BDS$,2)
  67. 8095  RESTORE 8150
  68. 8100  FOR K=1 TO 10:READ COMMAND$:IF LEFT$(COMMAND$,LEN(BDS$))=BDS$ THEN 8220 ELSE NEXT K
  69. 8110  PRINT "Unrecognized request !   Valid requests:"
  70. 8120  PRINT "Date,    Condition,  Position,  Lsupprot,  Warpfactor,"
  71. 8130  PRINT "Energy,  Torpedoes,   Shields,  Klingons,        TIme"
  72. 8135  PRINT
  73. 8140  GOTO 8085
  74. 8150  DATA "DA","CO","PO","LS","WA","EN","TO","SH","KL","TI"
  75. 8200  ' ENTRY FOR STATUS
  76. 8210  K=0
  77. 8220  LS$="N":RS$="Y"
  78. 8300  FOR L=1 TO 10
  79. 8310  JJ=L:IF K<>0 THEN JJ=K
  80. 8320  IF LS$<>"Y" THEN 8347
  81. 8330  PRINT USING "## ";L;
  82. 8340  FOR N=1 TO 10:PRINT CHR$(Q(L,N));" ";:NEXT N
  83. 8345  PRINT "     ";
  84. 8347  IF RS$<>"Y" THEN PRINT:GOTO 8360
  85. 8350  ON JJ GOSUB 8400,8410,8420,8430,8440,8450,8460,8470,8480,8490
  86. 8360  IF K=0 THEN NEXT L
  87. 8399  RETURN
  88. 8400  PRINT "Stardate........";:PRINT USING "####.#";D!:RETURN
  89. 8401  RETURN
  90. 8410  PRINT "Condition.......";:IF C=ASC("Y") THEN PRINT "Yellow" ELSE IF C=ASC("G") THEN PRINT "Green" ELSE IF C=ASC("R") THEN PRINT "Red" ELSE IF C=ASC("D") THEN PRINT "Docked" ELSE PRINT "Strange"
  91. 8411  RETURN
  92. 8420  PRINT "Position........";QX;"-";QY;", ";SX;"-";SY
  93. 8421  RETURN
  94. 8430  PRINT "Life support....";:IF D!(5)<>0 THEN PRINT "Damaged, ";:IF C=ASC("D") THEN PRINT "supported by starbase" ELSE PRINT "reserves=";:PRINT USING "##.#";L!;:PRINT "%" ELSE PRINT "Active"
  95. 8431  RETURN
  96. 8440  PRINT "Warp factor.....";:PRINT USING "##.#";W!:RETURN
  97. 8450  PRINT "Energy..........";:PRINT USING "####.#";E!:RETURN
  98. 8460  PRINT "Torpedoes.......";:PRINT USING "##";T:RETURN
  99. 8470  PRINT "Shields.........";:IF SU=0 THEN IF D!(8)<=0 THEN PRINT "Down,"; ELSE PRINT "Damaged,"; ELSE PRINT "Up,";
  100. 8471  PRINT USING "###.#";INT(100*S!/NSH!+0.5);:PRINT " %"
  101. 8472  RETURN
  102. 8480  PRINT "Klingons left...";:PRINT USING "###";RK:RETURN
  103. 8490  PRINT "Time left.......";:PRINT USING "##.#";RT!:RETURN
  104. 8500  ' lrscan
  105. 8510  IF D!(2)<>0 THEN PRINT "L. R. scanner damaged !":RETURN
  106. 8520  PRINT:PRINT "Long range scan for quadrant";QX;"-";QY
  107. 8530  FOR I=QX-1 TO QX+1:FOR J=QY-1 TO QY+1
  108. 8540  IF I<1 OR I>8 OR J<1 OR J>8 THEN IVAL=-1 ELSE IVAL=G(I,J):S(I,J)=1
  109. 8550  PRINT USING " ####";IVAL;
  110. 8560  NEXT J:PRINT:NEXT I
  111. 8590  RETURN
  112. 8600  ' chart
  113. 8610  PRINT:PRINT "Star chart for the known galaxy"
  114. 8620  PRINT:PRINT "    ";:FOR I=1 TO 8:PRINT "  "I;:NEXT I:PRINT
  115. 8630  PRINT "   ------------------------------------------"
  116. 8640  FOR I=1 TO 8:PRINT "   :":PRINT I;":";:FOR J=1 TO 8:PRINT " ";
  117. 8645  IF I=QX AND J=QY THEN COLOR 26
  118. 8650  IF S(I,J)<0 THEN PRINT " .1."; ELSE IF S(I,J)=0 THEN PRINT " ..."; ELSE IF S(I,J)>999 THEN PRINT USING "####";S(I,J)-1000; ELSE PRINT USING "####";G(I,J);
  119. 8655  IF I=QX AND J=QY THEN COLOR 7
  120. 8660  NEXT J:PRINT:NEXT I
  121. 8670  PRINT:PRINT "The ";S$;" is currently in quadrant";QX;"-";QY;"."
  122. 8690  RETURN
  123. 8700  ' shields
  124. 8710  GO=0:GOSUB 10000
  125. 8720  IF BDKEY$="A" THEN 8840
  126. 8730  MSG$="Do you wish to transfer shield energy ? ":GOSUB 8980
  127. 8750  IF I$="Y" THEN 8930
  128. 8760  IF D!(8)=0 THEN IF SU=1 THEN 8810 ELSE 8770
  129. 8761  PRINT "Shields damaged and down !":RETURN
  130. 8770  ' entry shldsup
  131. 8780  MSG$="Shields are down.  Do you want them up ? ":GOSUB 8980
  132. 8790  IF I$="Y" THEN 8850 ELSE RETURN
  133. 8810  MSG$="Shields are up.  Do you want them down ? ":GOSUB 8980
  134. 8820  IF I$="Y" THEN 8900 ELSE RETURN
  135. 8840  IF LEFT$(BDS$,1)="T" THEN 8930 ELSE IF D!(8)<>0 THEN 8761 ELSE IF LEFT$(BDS$,1)="U" THEN 8850 ELSE IF LEFT$(BDS$,1)="D" THEN 8900 ELSE 8730
  136. 8850  ' shields up
  137. 8860  IF SU<>0 THEN PRINT "Shields are already up !":RETURN
  138. 8870  SU=1:SC=1:IF C<>ASC("D") THEN E!=E!-50
  139. 8880  PRINT "Shields raised."
  140. 8890  IF E!<=0 THEN PRINT "Shields use up last of energy !":FIN=4:CHAIN "TREKFINE" ELSE GO=1:RETURN
  141. 8900  ' shields down
  142. 8910  IF SU=0 THEN PRINT "Shields already down !":RETURN
  143. 8920  SU=0:SC=1:GO=1:PRINT "Shields lowered.":RETURN
  144. 8930  ' transfer energy
  145. 8935  GOSUB 10000:IF BDKEY$<>"F" THEN IF BDKEY$="I" THEN BDF!=BDI ELSE PRINT "Energy to transfer to shields: ";:GOSUB 11000:GOTO 8935
  146. 8936  IF BDF!=0 THEN RETURN
  147. 8938  IF BDF!>E! THEN PRINT "Insufficient ship energy.":RETURN
  148. 8940  GO=1:S!=S!+BDF!:E!=E!-BDF!
  149. 8942  IF S!>NSH! THEN PRINT "Shield energy maximized.":PRINT "Excess energy requsted returned to ship energy.":E!=E!+S!-NSH!:S!=NSH!:RETURN
  150. 8944  IF BDF!>0 OR E!<=NE! THEN 8948
  151. 8946  PRINT "Engineering to bridge--":PRINT "  Scott here.  Power circuit problem, Captain.":PRINT "  I can't drain the shields.":E!=E!+BDF!:S!=S!-BDF!:GO=0:RETURN
  152. 8948  IF S!<=0 THEN PRINT "All shield energy transferred to ship.":E!=E!+S!:S!=0:RETURN
  153. 8950  PRINT "Scotty:  ";:IF BDF!>0 THEN PRINT "Transferring"; ELSE PRINT "Draining";
  154. 8952  PRINT " energy ";:IF BDF!>0 THEN PRINT "to"; ELSE PRINT "from";
  155. 8954  PRINT " shields."
  156. 8960  RETURN
  157. 8980  I$=INKEY$:IF LEN(I$)<>0 THEN 8980: 'flush
  158. 8985  PRINT MSG$;
  159. 8990  I$=INKEY$:IF LEN(I$)<>1 THEN 8990 ELSE IF I$>="a" AND I$<="z" THEN I$=CHR$(ASC(I$)-32)
  160. 8995  IF I$="Y" THEN PRINT "Yes" ELSE PRINT "No"
  161. 8999  RETURN
  162. 9000  ' dock
  163. 9010  IF C=ASC("D") THEN PRINT "Already docked !":RETURN
  164. 9020  IF O<>0 THEN PRINT "You must first leave standard orbit.":RETURN
  165. 9030  IF BX=0 THEN GOTO 9050
  166. 9040  IF ABS(SX-BX)<=1 AND ABS(SY-BY)<=1 THEN 9060
  167. 9050  PRINT "Not adjacent to base !":RETURN
  168. 9060  C=ASC("D"):IF E!<NE! THEN E!=NE!
  169. 9070  S!=NSH!:T=NT:L!=NL!
  170. 9080  PRINT "Docked."
  171. 9099  RETURN
  172. 9100  ' damage report
  173. 9110  RESTORE 9195
  174. 9120  JDAM=0
  175. 9130  FOR I=1 TO ND
  176. 9140  READ DEV$
  177. 9150  IF D!(I)<=0 THEN 9185
  178. 9160  IF JDAM<>0 THEN 9180
  179. 9170  PRINT "DEVICE                   -REPAIR TIMES-":PRINT "                      IN FLIGHT    DOCKED":PRINT:JDAM=1
  180. 9180  PRINT DEV$;TAB(25);
  181. 9182  IF I<>14 THEN PRINT USING "####.##    ###.##";D!(I),D!(I)*DF! ELSE PRINT "   -         9.99"
  182. 9185  NEXT I:IF JDAM=0 THEN PRINT "All devices functional."
  183. 9190  RETURN
  184. 9195  DATA "S. R. Sensors","L. R. Sensors","Phasers","Photon tubes","Life support","Warp Engines","Impulse engines","Shields","Subspace radio","Shuttle craft","Computer","Transporter","Shield control","Experimental Deathray"
  185. 9200  ' set warp factor
  186. 9210  GOSUB 10000:IF BDKEY$<>"F" THEN IF BDKEY$="I" THEN BDF!=BDI ELSE PRINT "Warp factor : ";:GOSUB 11000:GOTO 9210
  187. 9215  IF D!(6)>10 THEN PRINT "Warp engines inoperative.":RETURN
  188. 9220  IF D!(6)>0 AND BDF!>4 THEN PRINT "Engineer Scoot:  I'm doing my best, Captain,":PRINT "  but right now we can only go warp 4.":RETURN
  189. 9225  IF BDF!<1 THEN PRINT "Helmsman Sulu:  We can't go below warp 1, Captain.":RETURN
  190. 9230  IF BDF!>10 THEN PRINT "Helmsman Sulu:  Our top speed is warp 10, Captain.":RETURN
  191. 9235  OLDFAC!=W!:W!=BDF!:WS!=W!*W!
  192. 9240  IF W!<=OLDFAC! OR W!<=6 THEN PRINT "Helmsman Sulu:  Warp factor ";:PRINT USING "##.#";W!;:PRINT ", Captain.":RETURN
  193. 9245  IF W!<8 THEN PRINT "Engineer Scott:  Aye, but our maximum safe speed is warp 6.":RETURN
  194. 9250  IF W!=10 THEN PRINT "Engineer Scott:  Aye, Captain, we'll try it.":RETURN
  195. 9260  PRINT "Engineer Scott:  Aye, Captain, but our engines may not take it."
  196. 9299  RETURN
  197. 9300  ' planets
  198. 9310  PRINT "Spock:  Planet report follows, Captain.":PRINT
  199. 9320  IKNOW=0
  200. 9340  FOR I=1 TO NP:IF P(I,5)=0 THEN 9360
  201. 9342  IKNOW=1
  202. 9345  PRINT P(I,1);"-";P(I,2);" class ";:IF P(I,3)=1 THEN PRINT "M"; ELSE IF P(I,3)=2 THEN PRINT "N"; ELSE PRINT "O";
  203. 9350  IF P(I,4)=0 THEN PRINT " no";
  204. 9355  PRINT " dilithium crystals present."
  205. 9360  NEXT I
  206. 9365  IF IKNOW=1 THEN RETURN
  207. 9399  PRINT "No information available.":RETURN
  208. 9400  ' sensors
  209. 9410  IF D!(1)>0 THEN PRINT "Short range sensors damaged !":RETURN
  210. 9415  IF PX=0 THEN PRINT "No planet in this quadrant !":RETURN
  211. 9420  PRINT "Spock:  Sensor scan for"QX"-"QY":"
  212. 9425  PRINT:PRINT "Planet at";PX;"-";PY;"is of class ";
  213. 9430  IF P(P,3)=1 THEN PRINT "M." ELSE IF P(P,3)=2 THEN PRINT "N." ELSE PRINT "O."
  214. 9435  PRINT "    Readings indicate ";:IF P(P,4)=0 THEN PRINT "no ";
  215. 9440  PRINT "dilithium crystals present."
  216. 9450  P(P,5)=1
  217. 9499  RETURN
  218. 9500  'rest
  219. 9510  GO=0
  220. 9520  GOSUB 10000:IF BDKEY$="I" THEN AITEM!=BDI ELSE IF BDKEY$="F" THEN AITEM!=BDF! ELSE PRINT "How long ? ";:GOSUB 11000:GOTO 9520
  221. 9530  IF AITEM!<=0 THEN RETURN
  222. 9540  AITEM!=AITEM!+0.005:IF AITEM!<RT! AND HE=0 THEN 9560
  223. 9550  MSG$="Are you sure ? "
  224. 9555  GOSUB 8980:IF I$<>"Y" THEN RETURN
  225. 9560  R=1
  226. 9570  IF AITEM!<=0 THEN R=0
  227. 9572  IF R=0 THEN 9590
  228. 9574  TEMP!=AITEM!:T!=TEMP!:IF HE=0 THEN 9580
  229. 9576  RN!=RND(1):IF TEMP!>RN! THEN TEMP!=RN!
  230. 9578  T!=TEMP!
  231. 9580  IF T!<AITEM! THEN GOSUB 20000
  232. 9582  IF AD<>0 THEN RETURN
  233. 9584  GOSUB 30000
  234. 9586  GO=1:IF AD<>0 THEN RETURN
  235. 9588  AITEM!=AITEM!-TEMP!:IF G(QX,QY)<>1000 THEN 9570
  236. 9589  T!=0:R=0:RETURN
  237. 9590  PRINT USING "##.# stardates left.";RT!:RETURN
  238. 9595  PRINT "Beg your pardon, Captain ? ":RETURN
  239. 10000  ' break down IN$
  240. 10010  IF LEN(IN$)=0 THEN BDKEY$="*":RETURN
  241. 10020  BDB$=LEFT$(IN$,1):IF BDB$<>" " THEN 10060 ELSE IN$=RIGHT$(IN$,LEN(IN$)-1):GOTO 10010
  242. 10060  BDS$=""
  243. 10070  IF BDB$>="A" AND BDB$<="Z" THEN 10500
  244. 10100  ' numeric
  245. 10110  IF BDB$="-" OR BDB$="+" THEN IN$=RIGHT$(IN$,LEN(IN$)-1):BDF=VAL(BDB$+"1") ELSE BDF=1
  246. 10120  BDKEY$="I"
  247. 10130  IF LEN(IN$)=0 THEN 10200
  248. 10140  BDB$=LEFT$(IN$,1):IF (BDB$<"0" AND BDB$<>".") OR BDB$>"9" THEN 10200 ELSE BDS$=BDS$+BDB$:IN$=RIGHT$(IN$,LEN(IN$)-1):IF BDB$="." THEN BDKEY$="F"
  249. 10180  GOTO 10130
  250. 10200  IF LEN(BDS$)=0 THEN BDKEY$="*":RETURN
  251. 10210  IF BDKEY$="I" THEN BDI=VAL(BDS$)*BDF ELSE BDF!=VAL(BDS$)*BDF
  252. 10220  RETURN
  253. 10500  ' alpha
  254. 10600  IF LEN(IN$)=0 THEN 10650
  255. 10610  BDB$=LEFT$(IN$,1):IF BDB$=" " THEN 10650 ELSE BDS$=BDS$+BDB$:IN$=RIGHT$(IN$,LEN(IN$)-1):GOTO 10600
  256. 10650  IF LEN(BDS$)=0 THEN BDKEY$="*":RETURN
  257. 10660  BDKEY$="A"
  258. 10670  RETURN
  259. 11000  ' input IN$
  260. 11010  IN$=""
  261. 11020  I$=INKEY$:IF I$="" THEN 11020 ELSE IF LEN(I$)=2 THEN BEEP:GOTO 11020
  262. 11030  IF I$=CHR$(13) THEN PRINT:RETURN
  263. 11040  IF I$=CHR$(8) THEN IF LEN(IN$)<>0 THEN IN$=LEFT$(IN$,LEN(IN$)-1):PRINT CHR$(29);" ";CHR$(29);:GOTO 11020 ELSE BEEP:GOTO 11020
  264. 11050  IF I$<" " THEN BEEP:GOTO 10020
  265. 11060  IF I$>="a" AND I$<="z" THEN I$=CHR$(ASC(I$)-32)
  266. 11070  IN$=IN$+I$:PRINT I$;:GOTO 11020
  267. 12000  ' GET COMMAND
  268. 12010  ' try match on long commands
  269. 12020  RESTORE 12510:FOR I=22 TO 29:READ COMMAND$:IF COMMAND$=BDS$ THEN 12490 ELSE NEXT I
  270. 12030  RESTORE 12500:FOR I=1 TO 21:READ COMMAND$:IF LEFT$(COMMAND$,LEN(BDS$))=BDS$ THEN 12490 ELSE NEXT I:I=0
  271. 12490  COMM=I:RETURN
  272. 12500  DATA "CHART","CRYSTALS","DOCK","DAMAGES","IMPULSE","LRSCAN","MOVE","MINE"
  273. 12501  DATA "ORBIT","PHASERS","PHOTONS","PLANETS"
  274. 12502  DATA "SRSCAN","SENSORS","SHIELDS","SHUTTLE","STATUS","TRANSPORT"
  275. 12503  DATA "REQUEST","REST","WARP"
  276. 12510  DATA "ABANDON","DEATHRAY","DESTRUCT","HELP","TERMINATE","COMMAND","FREEZE","THAW"
  277. 15000  FOR MSI=1 TO MS:GET #1,MS(MSI):PRINT TMSG$:NEXT MSI:RETURN
  278. 20000  ' ATTACK subroutine
  279. 20010  IF AD<>0 THEN RETURN
  280. 20030  IF NZ<>0 THEN NZ=0:RETURN
  281. 20035  IF COMM=7 AND MSW=0 AND JI=0 THEN MSW=1:RETURN ELSE MSW=0
  282. 20040  IF (HC<>0 OR HS<>0) AND JI=0 THEN GOSUB 32000
  283. 20050  IF HE=0 THEN RETURN
  284. 20060  PFAC!=1/NSH!:IFRY=0:IHURT=0:PRINT
  285. 20070  IF C=ASC("D") THEN 20485
  286. 20080  HITTOT!=0:HITMAX!=0:CHGFAC!=1
  287. 20090  IF SC=1 THEN CHGFAC!=0.25+0.5*RND(1)
  288. 20095  ATTCKD=0:L=0
  289. 20100  L=L+1:IF L>HE THEN 20400
  290. 20110  IF KP!(L)<0 THEN 20100
  291. 20120  ATTCKD=1:DUSTFC!=0.8+0.05*RND(1):CR!(1)=KP!(L)*DUSTFC!^KA!(L)
  292. 20130  IF SU=0 AND SC=0 THEN 20190
  293. 20140  IF PFAC!*S!<0.1 THEN PROPOR!=0.1 ELSE PROPOR!=PFAC!*S!
  294. 20150  HITSH!=PROPOR!*CHGFAC!*CR!(1)+1:ABSORB!=0.8*HITSH!
  295. 20160  IF ABSORB!>S! THEN ABSORB!=S!
  296. 20170  S!=S!-ABSORB!:CR!(1)=CR!(1)-HITSH!
  297. 20180  IF PROPOR!>0.1 AND CR!(1)<0.005*E! THEN 20100
  298. 20190  IHURT=1:PRINT USING "####.#";CR!(1);:PRINT " units hit";
  299. 20200  IF S<=2 THEN PRINT " on the ";S$;
  300. 20210  PRINT " from the ";
  301. 20220  JX=KX(L):JY=KY(L)
  302. 20230  PRE=Q(JX,JY):GOSUB 32900
  303. 20260  PRINT " at";JX;"-";JY;"."
  304. 20270  IF CR!(1)>HITMAX! THEN HITMAX!=CR!(1)
  305. 20275  HITTOT!=HITTOT!+CR!(1)
  306. 20278  GOTO 20290
  307. 20280  ' entry fry
  308. 20285  IFRY=1
  309. 20290  IF CR!(1)<(275-25*S)*(1+0.5*RND(1)) THEN 20370
  310. 20295  NCRIT=1+CR!(1)/(500+100+RND(1))
  311. 20300  PRINT "***CRITICAL HIT-- ";
  312. 20305  KTR=1:DIM CDAM(10)
  313. 20310  FOR LL=1 TO NCRIT
  314. 20315  J=FNR(ND-1):IF D!(J)<0 OR (J=10 AND CG<>1) THEN 20315
  315. 20320  CDAM(LL)=J:EXTRDM!=(CR!(1)*DF!)/(NCRIT*(75+25*RND(1)))
  316. 20325  D!(J)=D!(J)+EXTRDM!
  317. 20330  IF LL=1 THEN 20350
  318. 20335  FOR LLL=2 TO LL:IF J=CDAM(LLL-1) THEN 20355 ELSE NEXT LLL
  319. 20340  KTR=KTR+1:IF KTR>3 THEN PRINT
  320. 20345  PRINT " and ";
  321. 20350  GOSUB 20390:PRINT DEV$;
  322. 20355  NEXT LL
  323. 20360  PRINT " damaged.":ERASE CDAM
  324. 20365  IF D!(8)<>0 AND SU<>0 THEN PRINT "***SHIELDS KNOCKED DOWN.":SU=0
  325. 20370  IF IFRY<>0 THEN RETURN
  326. 20375  E!=E!-CR!(1)
  327. 20379  GOTO 20100
  328. 20390  RESTORE 20398:FOR D=1 TO J:READ DEV$:NEXT D:RETURN
  329. 20398  DATA "S. R. Sensors","L. R. Sensors","Phasers","Photon Tubes","Life Support","Warp Engines","Impulse Engines","Shields","Subspace Radio","Shuttle Craft","Computer","Transporter","Shield Control","Experimental Deathray"
  330. 20400  IF ATTCKD=0 THEN RETURN
  331. 20410  IF E!<=0 THEN FIN=5:CHAIN "TREKFINE"
  332. 20420  PERCNT=INT(100*PFAC!*S!+0.5)
  333. 20430  IF IHURT<>0 THEN 20450
  334. 20440  PRINT "Enemies attack--shield strength reduced to ";:GOTO 20460
  335. 20450  PRINT:PRINT "Energy left ";:PRINT USING "####.#";E!;:PRINT "   Shields ";:IF SU<>0 THEN PRINT "up, "; ELSE IF D!(8)>0 THEN PRINT "damaged, "; ELSE PRINT "Down, ";
  336. 20460  PRINT USING "###";PERCNT;:PRINT "%  ";T;"torpedoes left"
  337. 20470  IF HITMAX!<200 AND HITTOT!<500 THEN 20490
  338. 20475  ICAS=INT(HITTOT!*RND(1)*0.015):IF ICAS<2 THEN 20490
  339. 20480  PRINT:PRINT "Mc Coy:  Sickbay to bridge.  We suffered"ICAS"casualties in that last attack.":CS=CS+ICAS:GOTO 20490
  340. 20485  PRINT "***Enemies attack-starbase shields protect the ";S$;"."
  341. 20490  FOR L=1 TO HE:KA!(L)=KD!(L):NEXT L
  342. 20495  GOSUB 20500
  343. 20499  RETURN
  344. 20500  ' SORTKL
  345. 20510  IF HE<=1 THEN RETURN
  346. 20520  SWITCH=0
  347. 20530  FOR KL=1 TO HE-1:IF KD!(KL)>KD!(KL+1) THEN SWAP KD!(KL),KD!(KL+1):SWAP KA!(KL),KA!(KL+1):SWAP KX(KL),KX(KL+1):SWAP KY(KL),KY(KL+1):SWAP KP!(KL),KP!(KL+1):SWITCH=1
  348. 20540  NEXT KL:IF SWITCH<>0 THEN 20520 ELSE RETURN
  349. 21000  ' photons
  350. 21010  MISFIR=0:GO=0:IF D!(4)<>0 THEN PRINT "Photon tubes damaged !":RETURN
  351. 21020  IF T=0 THEN PRINT "No torpedoes left !":RETURN
  352. 21030  GOSUB 10000:IF BDKEY$="I" THEN 21040
  353. 21032  PRINT T"torpedoes left."
  354. 21035  PRINT "Number of torpedoes to fire: ";:GOSUB 11000:GOTO 21030
  355. 21040  IF BDI<1 THEN RETURN ELSE IF BDI>3 THEN PRINT "Maximum of 3 torpedoes per burst.":GOTO 21035 ELSE IF BDI>T THEN 21032
  356. 21050  GO=1:N=BDI
  357. 21055  DIM TARG!(3,2),COURSE!(3)
  358. 21057  PRMT=0
  359. 21060  FOR I=1 TO N
  360. 21070  GOSUB 10000:IF BDKEY$="I" THEN BDF!=BDI:GOTO 21091 ELSE IF BDKEY$="F" THEN 21091 ELSE IF BDKEY$="*" AND I<>1 AND PRMT<>1 THEN 21100
  361. 21080  PRMT=1:PRINT "Target sector for torpedo number"I": ";:GOSUB 11000:GOSUB 10000
  362. 21090  IF BDKEY$="I" THEN BDF!=BDI:GOTO 21091 ELSE IF BDKEY$<>"F" THEN 21097
  363. 21091  TARG!(I,1)=BDF!
  364. 21092  GOSUB 10000:IF BDKEY$="I" THEN BDF!=BDI:GOTO 21093 ELSE IF BDKEY$<>"F" THEN 21097
  365. 21093  TARG!(I,2)=BDF!
  366. 21095  NEXT I
  367. 21096  GOTO 21110
  368. 21097  PRINT "Beg your pardon, Captain ?"
  369. 21098  ERASE TARG!,COURSE!:GO=0:RETURN
  370. 21100  FOR I=I TO N:TARG!(I,1)=TARG!(I-1,1):TARG!(I,2)=TARG!(I-1,2):NEXT I
  371. 21110  FOR I=1 TO N:FOR J=1 TO 2:IF TARG!(I,J)<1 OR TARG!(I,J)>10 THEN 21097 ELSE NEXT J,I
  372. 21120  FOR I=1 TO N
  373. 21130  DELTX!=0.1*(TARG!(I,2)-SY):DELTY!=0.1*(TARG!(I,1)-SX)
  374. 21140  IF DELTX!=0 AND DELTY!=0 THEN PRINT "Spock to Sickbay.  Dr. McCoy,  I recommend an immediate review of the captain's";:PRINT "psychological profile.":GOTO 21098
  375. 21150  IF DELTY!=0 THEN Z!=SGN(DELTX!)*1E+37 ELSE Z!=DELTX!/DELTY!
  376. 21160  TD!=ATN(-Z!)*1.90986:IF TD!<=0 THEN TD!=12+TD!
  377. 21165  IF DELTY!>=0 THEN IF TD!<=6 THEN TD!=TD!+6 ELSE TD!=TD!-6
  378. 21170  COURSE!(I)=TD!:IF DB=1 THEN PRINT "<COURSE("I")="COURSE!(I)">
  379. 21180  NEXT I
  380. 21200  FOR I=1 TO N:IF C<>ASC("D") THEN T=T-1
  381. 21210  J=I:R!=(RND(1)+RND(1))*0.5-0.5:IF ABS(R!)<0.47 THEN 21260
  382. 21220  R!=(RND(1)+1.2)*R!:MISFIR=1:IF N>1 THEN 21240
  383. 21230  PRINT "***TORPEDO MISFIRES.":GOTO 21250
  384. 21240  PRINT "***TORPEDO NUMBER"I"MISFIRES.":IF I<N THEN PRINT "    Remainder of burst aborted."
  385. 21250  IF RND(1)>0.2 THEN 21595
  386. 21255  PRINT "***Photon tubes damaged by misfire.":D!(4)=DF!*(1+2*RND(1)):GOTO 21595
  387. 21260  IF SU<>0 OR C=ASC("D") THEN R!=R!+0.000999999*S!*R!
  388. 21265  AC!=COURSE!(I)+0.25*R!
  389. 21270  ANGLE!=(15-AC!)*0.523599:BULSYE!=(15-COURSE!(I))*0.523599
  390. 21280  PRINT:IF N=1 THEN PRINT "Torpedo track: "; ELSE PRINT "Track for torpedo number"I": ";
  391. 21290  DELTAX!=-SIN(ANGLE!):DELTAY!=COS(ANGLE!):BIGGER!=ABS(DELTAX!):IF BIGGER!<ABS(DELTAY!) THEN BIGGER!=ABS(DELTAY!)
  392. 21295  DELTAX!=DELTAX!/BIGGER!:DELTAY!=DELTAY!/BIGGER!:X!=SX:Y!=SY
  393. 21300  FOR L=1 TO 15
  394. 21310  X!=X!+DELTAX!:IX=X!:IF IX<1 OR IX>10 THEN 21570
  395. 21320  Y!=Y!+DELTAY!:IY=Y!:IF IY<1 OR IY>10 THEN 21570
  396. 21330  IF POS(0)+10>80 THEN PRINT
  397. 21340  PRINT USING "##.#_-##.#  ";X!,Y!;
  398. 21350  IQUAD=Q(IX,IY):IF IQUAD=ASC(".") THEN 21560
  399. 21355  PRINT
  400. 21360  IF IQUAD=ASC("K") OR IQUAD=ASC("R") THEN 21390
  401. 21370  IF IQUAD<>ASC("C") AND IQUAD<>ASC("S") THEN 21510
  402. 21380  IF RND(1)>0.05 THEN 21390
  403. 21382  IF IQUAD=ASC("C") THEN PRINT "Commander"; ELSE PRINT "SUPER-Commander";
  404. 21384  PRINT " uses anti-photon device;  torpedo neutralized.":GOTO 21590
  405. 21390  FOR LL=1 TO HE:IF IX=KX(LL) AND IY=KY(LL) THEN 21400 ELSE NEXT LL
  406. 21400  KP!=KP!(LL):HIT!=700+100*RND(1)-1000*KD!(LL)*ABS(SIN(BULSYE!-ANGLE!)):HIT!=ABS(HIT!)
  407. 21410  Z!=ABS(KP!):IF HIT!<Z! THEN Z!=HIT!
  408. 21412  KP!(LL)=KP!-(SGN(KP!)*Z!):IF KP!(LL)<>0 THEN 21420
  409. 21415  DKX=IX:DKY=IY:DKE=IQUAD:GOSUB 21600
  410. 21416  GOTO 21590
  411. 21420  PRE=IQUAD:GOSUB 32900
  412. 21425  PRINT " at"IX"-"IY;
  413. 21430  ANG!=ANGLE!+2.5*(RND(1)-0.5)
  414. 21440  TEMP!=ABS(-SIN(ANG!)):IF TEMP!<ABS(COS(ANG!)) THEN TEMP!=ABS(COS(ANG!))
  415. 21450  XX!=-SIN(ANG!)/TEMP!:YY!=COS(ANG!):JX=IX+XX!:JY=IY+YY!
  416. 21460  IF JX<1 OR JX>10 OR JY<1 OR JY>10 THEN 21500
  417. 21470  IF Q(JX,JY)<>ASC(" ") THEN 21480
  418. 21475  PRINT "buffeted into black hole.":DKX=JX:DKY=JY:DKE=IQUAD:GOSUB 21600
  419. 21479  GOTO 21590
  420. 21480  IF Q(JX,JY)<>ASC(".") THEN 21500
  421. 21490  Q(JX,JY)=IQUAD:Q(IX,IY)=ASC("."):PRINT " damaged--":PRINT "  displaced by blast to"JX"-"JY
  422. 21495  KX(LL)=JX:KY(LL)=JY:KA!(LL)=FNP2!(SX,JX,SY,JY):KD!(LL)=KA!(LL):GOSUB 20500:GOTO 21590
  423. 21500  PRINT " damaged but not destroyed.":GOTO 21590
  424. 21510  IF IQUAD<>ASC("B") THEN 21520
  425. 21512  MS=1:MS(1)=29:GOSUB 15000
  426. 21514  IF S(QX,QY)<0 THEN S(QX,QY)=0
  427. 21516  FOR LLL=1 TO RB:IF BX(LLL)<>QX AND BY(LLL)<>QY THEN NEXT LLL
  428. 21518  BX(LLL)=BX(RB):BY(LLL)=BY(RB):RB=RB-1:Q(IX,IY)=ASC("."):BX=0:BY=0:G(QX,QY)=G(QX,QY)-10:KB=KB+1:GOSUB 49800:GOTO 21590
  429. 21520  IF IQUAD<>ASC("P") THEN 21530
  430. 21522  PRINT "Planet at"IX"-"IY"destroyed.":KP=KP+1:Q(IX,IY)=ASC("."):NS(QX,QY)=NS(QX,QY)-1
  431. 21524  FOR LLL=1 TO 5:P(P,LLL)=0:NEXT LLL
  432. 21526  PY=0:PX=0:P=0:Q(IX,IY)=ASC("."):IF LD=1 THEN FIN=15:CHAIN "TREKFINE" ELSE 21590
  433. 21530  IF IQUAD<>ASC("*") THEN 21540
  434. 21532  IF RND(1)<0.1 THEN PRINT "Star at"IX"-"IY"unaffected by photon blast.":GOTO 21590
  435. 21534  NX=IX:NY=IY:GOSUB 21800
  436. 21536  IF G(QX,QY)=1000 THEN 21599
  437. 21538  IF AD<>0 THEN 21599 ELSE 21590
  438. 21540  IF IQUAD<>ASC("?") THEN 21550
  439. 21542  MS=3:MS(1)=30:MS(2)=31:MS(3)=32:GOSUB 15000:Q(IX,IY)=ASC("."):GOTO 21590
  440. 21550  PRINT "Black hole at"IX"-"IY"swallows torpedo.":GOTO 21590
  441. 21560  NEXT L
  442. 21570  PRINT:PRINT "Torpedo missed."
  443. 21580  IF MISFIR<>0 THEN 21595
  444. 21590  NEXT I
  445. 21595  IF RK=0 THEN FIN=1:CHAIN "TREKFINE"
  446. 21599  ERASE TARG!,COURSE!:RETURN
  447. 21600  ' deadkl dkx,dky,dke
  448. 21610  PRE=DKE:GOSUB 32900
  449. 21620  PRINT " at"DKX"-"DKY;
  450. 21630  IF DKE=ASC("R") THEN 21720
  451. 21640  G(QX,QY)=G(QX,QY)-100
  452. 21650  HK=HK-1:RK=RK-1
  453. 21660  IF DKE=ASC("K") THEN 21700 ELSE IF DKE=ASC("S") THEN 21710
  454. 21670  HC=0:FOR DK=1 TO RC:IF CX(DK)<>QX OR CY(DK)<>QY THEN NEXT DK
  455. 21680  CX(DK)=CX(RC):CY(DK)=CY(RC):CX(RC)=0:CY(RC)=0:RC=RC-1:F!(2)=1E+37:IF RC<>0 THEN F!(2)=D!+FNE!(1*NC/RC)
  456. 21685  KC=KC+1:GOTO 21730
  457. 21700  KK=KK+1:GOTO 21730
  458. 21710  RS=0:HS=0:UX=0:UY=0:KS=1:SE=0:SB=0:F!(7)=1E+37:F!(6)=1E+37:GOTO 21730
  459. 21720  NS(QX,QY)=NS(QX,QY)-10:HR=HR-1:KR=KR+1:RR=RR-1
  460. 21730  PRINT "destroyed.":Q(DKX,DKY)=ASC("."):IF RK=0 THEN RETURN
  461. 21740  RT!=RR!/(RK+4*RC)
  462. 21750  FOR DK=1 TO HE:IF KX(DK)<>DKX OR KY(DK)<>DKY THEN NEXT DK
  463. 21755  HE=HE-1:IF DK>HE THEN 21770
  464. 21760  FOR DK=DK TO HE:KX(DK)=KX(DK+1):KY(DK)=KY(DK+1):KP!(DK)=KP!(DK+1):KA!(DK)=KA!(DK+1):KD!(DK)=KD!(DK+1):NEXT DK
  465. 21770  KX(HE+1)=0:KY(HE+1)=0:KP!(HE+1)=0:KA!(HE+1)=0:KD!(HE+1)=0
  466. 21790  RETURN
  467. 21800  ' nova(nx,ny)
  468. 21805  IF RND(1)<0.05 THEN ISNX=NX:ISNY=NY:GOSUB 31000:RETURN
  469. 21810  DIM HITS(10,2)
  470. 21815  Q(NX,NY)=ASC("."):PRINT "Star at"NX"-"NY"novas."
  471. 21820  G(QX,QY)=G(QX,QY)-1:KST=KST+1:TOP2=1:TOP=1:BOT=1:ICY=0:ICX=0:KOUNT=0:HITS(1,1)=NX:HITS(1,2)=NY
  472. 21825  FOR MM=BOT TO TOP:FOR NN=-1 TO 1:FOR OO=-1 TO 1
  473. 21830  IF NN=0 AND OO=0 THEN 21975
  474. 21835  II=HITS(MM,1)+NN:JJ=HITS(MM,2)+OO
  475. 21840  IF II<1 OR II>10 OR JJ<1 OR JJ>10 THEN 21975
  476. 21845  JQ$=CHR$(Q(II,JJ)):IF JQ$="." OR JQ$="?" OR JQ$=" " THEN 21975
  477. 21850  IF JQ$<>"*" THEN 21865
  478. 21855  IF RND(1)<0.05 THEN ERASE HITS:ISNX=II:ISNY=JJ:GOSUB 31000:RETURN
  479. 21860  TOP2=TOP2+1:HITS(TOP2,1)=II:HITS(TOP2,2)=JJ:G(QX,QY)=G(QX,QY)-1:KST=KST+1:PRINT "Star at"II"-"JJ"novas.":GOTO 21970
  480. 21865  IF JQ$<>"P" THEN 21875
  481. 21870  NS(QX,QY)=NS(QX,QY)-1:KP=KP+1:PRINT "Planet at"II"-"JJ"destroyed.":FOR KJ=1 TO 5:P(P,KJ)=0:NEXT KJ:P=0:PX=0:PY=0:IF LD=1 THEN FIN=16:CHAIN "TREKFINE" ELSE 21970
  482. 21875  IF JQ$<>"B" THEN 21890
  483. 21880  G(QX,QY)=G(QX,QY)-10:FOR KJ=1 TO RB:IF BX(KJ)<>QX OR BY(KJ)<>QY THEN NEXT KJ
  484. 21885  BX(KJ)=BX(RB):BY(KJ)=BY(RB):RB=RB-1:BX=0:BY=0:KB=KB+1:GOSUB 49800:PRINT "Starbase at"II"-"JJ"destroyed.":GOTO 21970
  485. 21890  IF JQ$<>LEFT$(S$,1) THEN 21925
  486. 21895  PRINT "***Starship buffeted by nova.":IF SU=0 THEN E!=E!-2000:GOTO 21910
  487. 21900  IF S!>=2000 THEN 21915
  488. 21905  DIFF=2000-S!:E!=E!-DIFF:S!=0:SU=0:PRINT "***Shields knocked down.":D!(8)=0.005*DF!*RND(1)*DIFF
  489. 21910  IF E!<=0 THEN FIN=7:CHAIN "TREKFINE" ELSE 21920
  490. 21915  S!=S!-2000
  491. 21920  ICX=ICX+SX-HITS(MM,1):ICY=ICY+SY-HITS(MM,2):KOUNT=KOUNT+1:GOTO 21975
  492. 21925  IF JQ$="K" THEN 21965
  493. 21930  FOR KJ=1 TO HE:IF KX(KJ)<>II OR KY(KJ)<>JJ THEN NEXT KJ
  494. 21935  KP!(KJ)=KP!(KJ)-800:IF KP!(KJ)<=0 THEN 21965
  495. 21940  NEWCX=II+II-HITS(MM,1):NEWCY=JJ+JJ-HITS(MM,2):PRE=ASC(JQ$):GOSUB 32900:PRINT " at"II"-"JJ"damaged";
  496. 21945  IF NEWCX<1 OR NEWCX>10 OR NEWCY<1 OR NEWCY>10 THEN 21960
  497. 21950  JQ1$=CHR$(Q(NEWCX,NEWCY)):IF JQ1$<>" " THEN 21952
  498. 21951  PRINT " buffeted into black hole at"NEWCX"-"NEWCY;:GOTO 21965
  499. 21952  IF JQ1$<>"." THEN 21960
  500. 21955  PRINT " buffeted to"NEWCX"-"NEWCY;:Q(II,JJ)=ASC("."):Q(NEWCX,NEWCY)=ASC(JQ$):KX(KJ)=NEWCX:KY(KJ)=NEWCY:KA!(KJ)=FNP2!(SX,NEWCX,SY,NEWCY):KD!(KJ)=KA!(KJ)
  501. 21960  PRINT:GOTO 21975
  502. 21965  DKX=II:DKY=JJ:DKE=Q(II,JJ):GOSUB 21600:GOTO 21975
  503. 21970  PRINT:Q(II,JJ)=ASC(".")
  504. 21975  NEXT OO,NN,MM
  505. 21980  IF TOP<>TOP2 THEN BOT=TOP+1:TOP=TOP2:GOTO 21825
  506. 21982  ERASE HITS:IF KOUNT=0 THEN RETURN
  507. 21984  DS!=KOUNT*0.1:IF ICX<>0 THEN ICX=SGN(ICX)
  508. 21986  IF ICY<>0 THEN ICY=SGN(ICY)
  509. 21987  INDEX=INT(3*(ICX+1)+ICY+2)
  510. 21988  RESTORE 21999:FOR KJ=1 TO INDEX:READ DR!:NEXT KJ
  511. 21989  IF DR!=0 THEN DS!=0
  512. 21990  IF DS!=0 THEN RETURN
  513. 21992  T!=10*DS!/16:PRINT "Force of nova displaces starship.":GOSUB 34100
  514. 21994  T!=10*DS!/16
  515. 21996  RETURN
  516. 21999  DATA 10.5,12.0,1.5,9.0,0.0,3.0,7.5,6.0,4.5
  517. 22000  ' phasers
  518. 22002  PRINT:IPOOP=1:IFAST=0
  519. 22005  IF C=ASC("D") THEN MS=1:MS(1)=33:GOSUB 15000:RETURN
  520. 22010  IF D!(3)<>0 THEN PRINT "Phaser control damage.":RETURN
  521. 22012  IF SU=0 THEN 22035
  522. 22015  IF D!(13)<>0 THEN PRINT "High-speed shield control damage.":RETURN
  523. 22020  IF E!<=200 THEN MS=1:MS(1)=34:GOSUB 15000:RETURN
  524. 22030  E!=E!-200:IFAST=1
  525. 22035  IF D!(1)+D!(11)>0 THEN IPOOP=0
  526. 22038  DIM HITS!(20):PHASFC!=2:NO=0:GO=1
  527. 22040  GOSUB 10000:IF BDKEY$="A" THEN 22045
  528. 22042  PRINT "Manual or automatic ? ";:GOSUB 11000:GOTO 22040
  529. 22045  IF D!(1)<>0 THEN 22190 ELSE IF D!(11)<>0 THEN 22180
  530. 22050  IF LEFT$(BDS$,1)="M" THEN GOSUB 10000:IF BDKEY$="A" AND LEFT$(BDS$,1)="N" THEN NO=1:GOTO 22200 ELSE 22200 ELSE IF LEFT$(BDS$,1)<>"A" THEN 22042
  531. 22052  ' automatic
  532. 22055  GOSUB 10000:IF BDKEY$="I" THEN BDF!=BDI:GOTO 22070 ELSE IF BDKEY$="F" THEN 22070
  533. 22060  IF HE<>0 THEN PRINT "Phasers locked on target.  ";
  534. 22062  PRINT "Energy available = ";:PRINT USING "####.##";E!
  535. 22065  PRINT "Units to fire: ";:GOSUB 11000:GOTO 22055
  536. 22070  GOSUB 10000:IF BDKEY$="A" AND LEFT$(BDS$,1)="N" THEN NO=1
  537. 22072  IF BDF!>E! THEN 22062
  538. 22075  IF BDF!<=0 THEN 22285
  539. 22080  POW!=BDF!
  540. 22085  GOTO 22125
  541. 22090  PRINT:IF RND(1)<0.998 THEN 22120
  542. 22092  GOSUB 48900:PRINT:HIT!=POW!*S!/NSH!:E!=E!-POW!-HIT!*0.8:S!=S!-HIT!*0.2:IF E!>0 THEN 22100
  543. 22095  MS=1:MS(1)=35:GOSUB 15000:PRINT STRING$(79,"*"):FIN=12:CHAIN "TREKFINE
  544. 22100  PRINT "Sulu:  Captain,  shield malfunction, phaser fire contained.":PRINT:PRINT "Lt. Uhura:  Sir,  all decks reporting damage."
  545. 22105  ICAS=HIT*RND(1)*0.012:PRINT:CR!(1)=0.8*HIT:GOSUB 20280:' fry
  546. 22110  IF ICAS<>0 THEN PRINT "McCoy to bridge:  Severe radiation burns, Jim.":PRINT ICAS"casualties so far.":CS=CS+ICAS
  547. 22115  PRINT:PRINT "Phaser energy dispersed by shields.":PRINT "Enemy unaffected !":GOTO 22335
  548. 22120  PRINT "Shields lowered.":ON EXIT GOTO 22130,22275
  549. 22125  IF IFAST<>0 THEN EXIT=1:GOTO 22090
  550. 22130  E!=E!-POW!:EXT!=POW!:IF HE=0 THEN 22163
  551. 22135  EXT!=0:POWREM!=POW!
  552. 22140  FOR IEN=1 TO HE:HITS!(IEN)=0:IF POWREM!<=0 THEN
  553. 22145  HITS!(IEN)=ABS(KP!(IEN))/(PHASFC!*0.9^KD!(IEN)):OVER!=0.01*RND(1)*HITS!(IEN):TEMP!=POWREM!:POWREM!=POWREM!-HITS!(IEN)-OVER!:IF POWREM!<=0 THEN IF HITS!(IEN)>TEMP! THEN HITS!(IEN)=TEMP!
  554. 22150  IF POWREM!<=0 THEN OVER!=0
  555. 22155  EXT!=EXT!+OVER!:NEXT IEN
  556. 22158  IF POWREM!>0 THEN EXT!=EXT!+POWREM!
  557. 22160  GOSUB 22400:'hitem(hits)
  558. 22162  IF EXT!=0 OR AD<>0 THEN 22290
  559. 22163  PRINT USING "####.##";EXT!;:PRINT " expended on empty space.":GOTO 22290
  560. 22170  ' manual
  561. 22180  PRINT "Battle computer damaged; manual fire only.":GOTO 22200
  562. 22190  PRINT "---WORKING---":PRINT "Short range sensors damaged.  Insufficient data for automatic fire.":PRINT "Manual fire must be used.":PRINT
  563. 22200  PRINT "Energy available = ";:PRINT USING "####.##";E!:IEK=1
  564. 22205  IF IPOOP=0 THEN 22220
  565. 22210  PRINT USING "(####.#)  ";ABS(KP!(IEK))/(PHASFC!*0.9^KD!(IEK))*(1.01+0.05*RND(1))+1;
  566. 22220  IEX=KX(IEK):IEY=KY(IEK):PRINT "Units to fire at ";:PRE=Q(IEX,IEY):GOSUB 32900:PRINT " at"IEX"-"IEY":";
  567. 22225  GOSUB 11000:IF IEK=1 THEN POW!=0
  568. 22230  GOSUB 10000
  569. 22232  IF BDKEY$="I" THEN HITS!(IEK)=BDI:GOTO 22240 ELSE IF BDKEY$="F" THEN HITS!(IEK)=BDF!:GOTO 22240
  570. 22233  IF BDKEY$="*" THEN HITS!(IEK)=0:GOTO 22240
  571. 22235  IF BDKEY$="A" THEN IF LEFT$(BDS$,1)="N" THEN NO=1
  572. 22239  GOTO 22205
  573. 22240  IF HITS!(IEK)<0 THEN 22285
  574. 22245  POW!=POW!+HITS!(IEK):IF POW!>E! THEN PRINT "Available energy exceeded.":GOTO 22200
  575. 22250  IEK=IEK+1:IF IEK<=HE THEN 22205
  576. 22255  IF POW!=0 THEN 22285
  577. 22260  GOSUB 10000:IF BDKEY$="A" AND LEFT$(BDS$,1)="N" THEN NO=1
  578. 22265  E!=E!-POW!:IF IFAST=0 THEN 22275
  579. 22270  EXIT=2:GOTO 22090
  580. 22275  GOSUB 22400:'hitem(hits)
  581. 22280  GO=1:GOTO 22290
  582. 22285  GO=0:IF IFAST<>0 THEN E!=E!+200
  583. 22287  GOTO 22399
  584. 22290  IF AD<>0 THEN 22399
  585. 22295  IF IFAST=0 THEN 22335
  586. 22300  PRINT:IF NO<>0 THEN NO=0:GOTO 22325
  587. 22310  IF RND(1)<0.99 THEN 22330
  588. 22320  MS=2:MS(1)=36:MS(2)=37:GOSUB 15000
  589. 22325  SU=0:E!=E!+200:GOTO 22335
  590. 22330  PRINT "Shields raised.":SU=1
  591. 22335  IF POW!<=1500 THEN 22399
  592. 22340  CHKBRN!=(POW!-1500)*0.000379999
  593. 22345  IF RND(1)>CHKBRN! THEN 22399
  594. 22350  PRINT:MS=1:MS(1)=38:GOSUB 15000:D!(3)=DF!*(1+RND(1))*(1+CHKBRN!)
  595. 22399  ERASE HITS!:RETURN
  596. 22400  'hitem(hits)
  597. 22405  PRINT:NENHR2=HE:IHKK=1
  598. 22410  FOR IHK=1 TO NENHR2:WHAM!=HITS!(IHK):IF WHAM!=0 THEN 22490
  599. 22415  DUSTFC!=0.9+0.01*RND(1):HIT!=WHAM!*DUSTFC!^KD!(IHKK)
  600. 22420  KP!=KP!(IHKK):KP2!=ABS(KP!):IF PHASFC!*HIT!<KP2! THEN KP2!=PHASFC!*HIT!
  601. 22425  KP!(IHKK)=KP!-SGN(KP!)*KP2!:KPOW!=KP!(IHKK):IHII=KX(IHKK):IHJJ=KY(IHKK)
  602. 22430  IF HIT!>0.005 THEN PRINT USING "####.#";HIT!;:PRINT " unit hit on "; ELSE PRINT "Very small hit on ";
  603. 22435  PRE=Q(IHII,IHJJ):GOSUB 32900:PRINT " at"IHII"-"IHJJ
  604. 22440  IF KPOW!<>0 THEN 22460
  605. 22445  DKE=Q(IHII,IHJJ):DKX=IHII:DKY=IHJJ:GOSUB 21600
  606. 22450  IF RK=0 THEN FIN=1:CHAIN "TREKFINE
  607. 22455  IF AD<>0 THEN RETURN
  608. 22459  GOTO 22495
  609. 22460  IF KPOW!<0 THEN 22490
  610. 22465  IF RND(1)<0.9 THEN 22490
  611. 22470  IF KPOW!>((0.4+0.4*RND(1))*KP!) THEN 22490
  612. 22475  PRINT "Mr. Spock:  Captain, the vessel at"IHII"-"IHJJ"has just lost its firepower."
  613. 22480  KP!(IHKK)=-KPOW!
  614. 22490  IHKK=IHKK+1
  615. 22495  NEXT IHK
  616. 22499  RETURN
  617. 23000  'impulse
  618. 23010  IF D!(7)<>0 THEN PRINT "Impulse engines damaged !":RETURN
  619. 23020  IF E!>30 THEN 23060
  620. 23030  PRINT:MS=2:MS(1)=39:MS(2)=40:GOSUB 15000
  621. 23040  IF E!>30 THEN PRINT "We can go, therefore, a maximum of":PRINT USING "##.# quadrants.";0.01*(E!-20) ELSE PRINT "They are, therefore, useless."
  622. 23050  RETURN
  623. 23060  GOSUB 34700
  624. 23065  IF DR!<0 THEN RETURN
  625. 23070  POWER!=20+100*DS!:IF POWER!>=E! THEN 23030
  626. 23075  T!=DS!/0.095:IF T!<RT! THEN
  627. 23080  MS=2:MS(1)=41:MS(2)=42:GOSUB 15000:MSG$="Are you sure we dare spend the time ? ":GOSUB 8980:IF I$<>"Y" THEN RETURN
  628. 23085  GOSUB 34100:GO=1:IF AD<>0 THEN RETURN
  629. 23090  POWER!=20+100*DS!:E!=E!-POWER!:T!=DS!/0.095:IF E!<=0 THEN FIN=4:CHAIN "TREKFINE
  630. 23095  RETURN
  631. 23100  'orbit
  632. 23105  MS=1
  633. 23110  IF O<>0 THEN MS(1)=72:GOSUB 15000:RETURN
  634. 23120  IF D!(7)<>0 AND D!(6)<>0 THEN MS(1)=73:GOSUB 15000:RETURN
  635. 23130  IF PX=0 OR ABS(PX-SX)>1 OR ABS(PY-SY)>1 THEN MS(1)=74:GOSUB 15000:RETURN
  636. 23135  T!=0.02+0.03*RND(1):IF D!(5)>0 THEN T!=T!*10
  637. 23140  PRINT:MS(1)=75:GOSUB 15000:GOSUB 49800:GO=1
  638. 23145  GOSUB 30000:IF AD<>0 THEN RETURN ELSE IF G(QX,QY)=1000 THEN RETURN ELSE IF JI<>0 THEN RETURN
  639. 23150  H!=1400+7200*RND(1):PRINT "  Altitude ";:PRINT USING "####.## Kilometers.";H!
  640. 23155  O=1:RETURN
  641. 23200  ' beam
  642. 23210  IF D!(12)<>0 THEN PRINT "Transporter damaged.":IF D!(10)=0 THEN MS=1:MS(1)=43:GOSUB 15000:RETURN ELSE RETURN
  643. 23215  IF O=0 THEN PRINT "Not in standard orbit.":RETURN
  644. 23220  IF SU<>0 THEN MS=1:MS(1)=44:GOSUB 15000:RETURN
  645. 23225  IF P(P,5)=1 THEN 23230
  646. 23227  MS=2:MS(1)=45:MS(2)=46:GOSUB 15000:RETURN
  647. 23230  IF LD=1 THEN 23260
  648. 23235  IF P(P,4)<>1 THEN MS=2:MS(1)=47:MS(2)=48:GOSUB 15000:GOSUB 23290:IF I$<>"Y" THEN RETURN
  649. 23240  MS=3:MS(1)=49:MS(2)=50:MS(3)=51:GOSUB 15000
  650. 23245  LOCATE ,,0:MSG$="WWHHOOOIIIIIRRRRREEEEE.E.E. . . .  .  .   .   .":FOR I=1 TO LEN(MSG$):PRINT MID$(MSG$,I,1);:FOR J=1 TO 10:NEXT J:NEXT I:PRINT:FOR I=1 TO 400:NEXT I:FOR I=LEN(MSG$) TO 1 STEP -1:PRINT MID$(MSG$,I,1);:FOR J=1 TO 10:NEXT J:NEXT I
  651. 23247  LOCATE ,,1
  652. 23250  PRINT:PRINT "Transport complete.":LD=-1*LD:IF LD<>1 AND MN=1 THEN CR=1
  653. 23255  MN=0:RETURN
  654. 23260  IF CG=0 THEN MS=1:MS(1)=52:GOSUB 15000:RETURN
  655. 23265  MS=3:MS(1)=53:MS(2)=54:MS(3)=55:GOSUB 15000:GOTO 23245
  656. 23270  PRINT:MS=2:MS(1)=56:MS(2)=57:GOSUB 15000:FIN=13:CHAIN "trekfine"
  657. 23290  MSG$="Are you sure this is wise ? ":GOSUB 8980
  658. 23299  RETURN
  659. 23300  'mine
  660. 23310  IF LD<>1 THEN MS=1:MS(1)=58:GOSUB 15000:RETURN
  661. 23315  IF P(P,4)<>1 THEN MS=1:MS(1)=59:GOSUB 15000:RETURN
  662. 23320  T!=(0.1+0.2*RND(1))*P(P,3)
  663. 23325  EXIT=1:GOTO 23900
  664. 23330  PRINT "Mining operation complete.":MN=1:RETURN
  665. 23400  'crystal
  666. 23410  IF CR<>1 THEN MS=1:MS(1)=60:GOSUB 15000:RETURN
  667. 23415  IF E!>=1000 THEN MS=2:MS(1)=61:MS(2)=62:GOSUB 15000:RETURN
  668. 23420  MS=2:MS(1)=63:MS(2)=64:GOSUB 15000:GOSUB 23290:IF I$<>"Y" THEN RETURN
  669. 23425  MS=1:MS(1)=65:GOSUB 15000:CP!=CP!*2
  670. 23430  FOR I=1 TO 500:NEXT I:MS=1:MS(1)=66:GOSUB 15000:FOR I=1 TO 200:NEXT I:MS(1)=67:GOSUB 15000
  671. 23435  FOR I=1 TO 200:NEXT I:PRINT:PRINT "Activating now - - ";:IF RND(1)>CP! THEN 23450
  672. 23440  PRINT "No good !  It's*****":GOSUB 48900
  673. 23441  PRINT "***************     KA-BOOM   **************":GOSUB 26035
  674. 23445  RETURN
  675. 23450  E!=E!+5000*(1+0.9*RND(1)):CR=0:PRINT "The instruments are going crazy, but i think":PRINT "it's going to work.  CONGRATULATIONS, Sir.":RETURN
  676. 23500  'shuttle
  677. 23510  MS=1
  678. 23512  IF D!(10)=0 THEN 23525
  679. 23520  IF D!(10)>0 THEN MS(1)=69:GOSUB 15000:RETURN ELSE IF D!=-1 THEN MS(1)=70:GOSUB 15000:RETURN ELSE MS(1)=71:GOSUB 15000:RETURN
  680. 23525  IF O<>1 THEN MS(1)=134:GOSUB 15000:RETURN
  681. 23530  IF SU=1 OR C=ASC("D") THEN MS(1)=68:GOSUB 15000:RETURN
  682. 23535  IF P(P,5)<>1 THEN 23227
  683. 23540  T!=2.9998E-05*H!:IF T!<0.8*RT! THEN 23545
  684. 23542  PRINT "First Officier Spock:  Captain, I compute that such a maneuver would":PRINT "require approximately ";:PRINT USING "###.#";100*T!/RT!;:PRINT "% of our remaining time.":GOSUB 23290:IF I$<>"Y" THEN RETURN
  685. 23545  IF LD<>1 THEN 23580
  686. 23550  IF CG<>1 THEN 23570
  687. 23555  IF D!(12)=0 THEN MSG$="Spock:  Would you rather use the transporter ? ":GOSUB 8980:IF I$<>"N" THEN PRINT "No":RETURN ELSE PRINT "Yes" PRINT "Shuttle crew"; ELSE PRINT "Rescue party";
  688. 23560  PRINT " boards 'Galileo' and swoops toward planet surface.":CG=0:PRINT:EXIT=2:GOTO 23900
  689. 23565  PRINT "Trip complete.":RETURN
  690. 23570  MS=3:MS(1)=116:MS(2)=117:MS(3)=118:GOSUB 15000:CF=1:LD=-1:EXIT=3:GOTO 23900
  691. 23575  CF=0:CG=1:IF MN<>0 THEN CR=1:MN=0:GOTO 23565
  692. 23580  MS=3:MS(1)=119:MS(2)=120:MS(3)=121:GOSUB 15000:CF=1:CG=0:EXIT=4:GOTO 23900
  693. 23590  LD=1:CF=0:GOTO 23565
  694. 23900  GO=1:GOSUB 30000:IF AD<>0 OR G(QX,QY)=1000 OR JI<>0 THEN RETURN
  695. 23910  ON EXIT GOTO 23330,23565,23575,23590
  696. 24000  ' deathray
  697. 24005  MS=1:IF LEFT$(S$,1)<>"E" THEN MS(1)=76:GOSUB 15000:RETURN
  698. 24010  IF HE<1 THEN MS(1)=77:GOSUB 15000:RETURN
  699. 24015  MS=2:MS(1)=78:MS(2)=79:GOSUB 15000:GOSUB 23290:IF I$<>"Y" THEN RETURN
  700. 24017  FOR I=1 TO 4:SOUND 987.7,5:SOUND 329.63,5:NEXT I
  701. 24020  GO=1:MS=5:MS(1)=80:MS(2)=81:MS(3)=82:MS(4)=83:MS(5)=84::GOSUB 15000
  702. 24025  MSG$="WHIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR":FOR I=1 TO LEN(MSG$):PRINT MID$(MSG$,I,1);:FOR J=1 TO 10:NEXT J,I
  703. 24026  R!=RND(1):IF R!>0.2 THEN 24030
  704. 24027  MS=1:MS(1)=85:GOSUB 15000:GOSUB 48900:MS(1)=86:GOSUB 15000:GOTO 23441
  705. 24030  IF R!>0.7 THEN 24050
  706. 24035  MS=1:MS(1)=85:GOSUB 15000:PRINT
  707. 24040  FOR I=1 TO HE:DKX=KX(1):DKY=KY(1):DKE=Q(DKX,DKY):GOSUB 21600:NEXT I
  708. 24045  MS(1)=87:GOSUB 15000:IF RK=0 THEN FIN=1:CHAIN "TREKFINE"
  709. 24047  MS=2:MS(1)=132:MS(2)=133:GOSUB 15000:D!(14)=9.99/DF!:RETURN
  710. 24050  IF R!>0.8 THEN 24060
  711. 24055  MS=6:MS(1)=88:MS(2)=89:MS(3)=90:MS(4)=91:MS(5)=92:MS(6)=93:GOSUB 15000:FIN=19:CHAIN "TREKFINE"
  712. 24060  IF R!>0.9 THEN 24070
  713. 24065  MS=2:MS(1)=94:MS(2)=95:GOSUB 15000:FOR I=1 TO 10:FOR J=1 TO 10:IF Q(I,J)=46 THEN Q(I,J)=ASC("?")
  714. 24068  NEXT J,I
  715. 24069  MS=2:MS(1)=96:MS(2)=97:GOSUB 15000:RETURN
  716. 24070  MS=3:MS(1)=98:MS(2)=99:MS(3)=100:GOSUB 15000:FIN=20:CHAIN "TREKFINE"
  717. 24100  ' abandon
  718. 24105  MS=1:IF D!(10)=-1 THEN MS(1)=70:GOSUB 15000:RETURN
  719. 24110  IF D!(10)<0 THEN MS(1)=71:GOSUB 15000:RETURN
  720. 24115  IF D!(10)<>0 THEN MS(1)=69:GOSUB 15000:RETURN
  721. 24120  IF LD=1 OR CF=1 THEN MS(1)=101:GOSUB 15000:RETURN
  722. 24125  IF CG<>1 THEN MS(1)=102:GOSUB 15000:RETURN
  723. 24130  PRINT:MS=3:MS(1)=103:MS(2)=104:MS(3)=105:GOSUB 15000
  724. 24135  IF RB=0 THEN FIN=9:CHAIN "TREKFINE
  725. 24140  PRINT:MS=3:MS(1)=107:MS(2)=108:MS(3)=109:GOSUB 15000
  726. 24145  NUB=FNR(RB):SE=0:MN=0:CR=0:QX=BX(NUB):QY=BY(NUB)
  727. 24150  SX=5:SY=5:GOSUB 49000:Q(SX,SY)=46:FOR L=1 TO 3:SX=FNR(3)-2+BX:IF SX<1 OR SX>10 THEN 24165
  728. 24155  SY=FNR(3)-2+BY:IF SY<1 OR SY>10 THEN 24165
  729. 24160  IF Q(SX,SY)=46 THEN 24170
  730. 24165  NEXT L:GOTO 24150
  731. 24170  Q(SX,SY)=ASC("F"):S$="Faerie Queene":C=ASC("D"):
  732. 24175  FOR L=1 TO ND:D!(L)=0:NEXT L
  733. 24180  D!(10)=-1:E!=3000:NE!=3000:S!=1250:NSH!=1250:T=6:NT=6:L!=3:NL!=3:SU=0:W!=5:WS!=25:RETURN
  734. 24200  'help
  735. 24205  MS=1:IF C=ASC("D") THEN MS(1)=110:GOSUB 15000:RETURN
  736. 24210  IF D!(9)<>0 THEN MS(1)=111:GOSUB 15000:RETURN
  737. 24215  IF RB<1 THEN MS(1)=112:GOSUB 15000:RETURN
  738. 24220  IF LD=1 THEN PRINT "You must be aboard the"S$".":RETURN
  739. 24225  IF CG=0 THEN MS(1)=52:GOSUB 15000:RETURN
  740. 24230  IF S<3 THEN MS=2:MS(1)=113:MS(2)=114:GOSUB 15000:GOSUB 23290:IF I$<>"Y" THEN RETURN
  741. 24235  NH=NH+1:IF BX=0 THEN 24245
  742. 24240  DS!=FNP2!(BX,SX,BY,SY):GOTO 24250
  743. 24245  DS!=1E+37:FOR L=1 TO RB:XDS!=10*FNP2!(BX(L),QX,BY(L),QY):IF DS!>XDS! THEN DS!=XDS!:LIN=L
  744. 24249  NEXT L:QX=BX(LIN):QY=BY(LIN):CR!(2)=1:GOSUB 49000:CR!(2)=0
  745.